import json
import re


# 合并对象
def merge(target, source):
    for i, item in enumerate(target):
        item.update(source[i])


# 读取JSON
def read_json(file):
    with open(file, "r", encoding="utf-8") as f:
        return json.load(f)


# 保存JSON
def save_json(file, obj):
    with open(file, "w", encoding="utf-8") as f:
        json.dump(obj, f, ensure_ascii=False, indent=4)


# 提取部分数据
def extract_json(data, keys):
    return [{key: item[key] for key in keys} for item in data]


# 读取文件
def read_file(file):
    with open(file, "r", encoding="utf-8") as f:
        return f.read()


# 保存文件
def save_file(file, str):
    with open(file, "w", encoding="utf-8") as f:
        f.write(str)


# 从字符串中提取 JSON
def extract_json_from_str(text):
    """
    从字符串中提取 {} 内的 JSON 数据并转换为 Python 对象
    :param text: 包含 JSON 的字符串
    :return: 解析后的 Python 字典，若失败则返回 None
    """
    try:
        # 使用正则匹配 {} 之间的内容（支持多行）
        match = re.search(r"\{.*\}", text, re.DOTALL)
        if match:
            json_content = match.group(0)
            return json.loads(json_content)
        return None
    except json.JSONDecodeError:
        return None


def extract_json_from_str2(input_str):
    """
    从字符串中提取JSON内容：
    1. 如果字符串包含```json{...}```格式，提取其中的JSON部分
    2. 否则尝试将整个字符串解析为JSON
    3. 如果都失败，返回None
    """
    # 尝试匹配```json{...}```格式
    json_block_pattern = r"```json\s*({.*?})\s*```"
    match = re.search(json_block_pattern, input_str, re.DOTALL)

    if match:
        # 找到```json包裹的JSON内容
        json_str = match.group(1)
    else:
        # 没有```json包裹，尝试直接解析整个字符串
        json_str = input_str

    try:
        # 尝试解析JSON
        return json.loads(json_str)
    except json.JSONDecodeError:
        # 如果解析失败，返回None
        return None
